package nl.hu.vakantievibes.ui;

import java.util.Date;

import nl.hu.vakantievibes.client.FieldVerifier;
import nl.hu.vakantievibes.client.LocatieFactory;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.datepicker.client.DateBox;

public class ReisToevoegen {

	private Label lblNaam, lblLand, lblPlaats, lblPrijs, lblVertrekDatum, lblAankomstDatum, lblOmschrjiving;
	private TextBox txtNaam, txtPrijs;
	private TextArea txtOmschrijving;
	private SuggestBox txtLand, txtPlaats;
	private MultiWordSuggestOracle orcLand, orcPlaats;
	private DateBox boxVertrekDatum, boxAankomstDatum;
	private Button btnSubmit, btnReset;
	private Date datToday;
	
	public ReisToevoegen() {
		lblNaam = new Label("Reis Naam:");
		txtNaam = new TextBox();
		
		lblLand = new Label("Land:");
		orcLand = new MultiWordSuggestOracle();
		txtLand = new SuggestBox(orcLand);
		
		lblPlaats = new Label("Plaats:");
		orcPlaats = new MultiWordSuggestOracle();
		txtPlaats = new SuggestBox(orcPlaats);
		
		lblPrijs = new Label("Prijs (in euro's):");
		txtPrijs = new TextBox();
		
		datToday = new Date();
		
		lblVertrekDatum = new Label("Vertrek Datum:");
		boxVertrekDatum = new DateBox();
		boxVertrekDatum.setFocus(false);
		
		lblAankomstDatum = new Label("Terugkomst Datum:");
		boxAankomstDatum = new DateBox();
		boxAankomstDatum.setFocus(false);
		
		lblOmschrjiving = new Label("Omschrijving:");
		txtOmschrijving = new TextArea();	
		
		btnSubmit = new Button("Toevoegen");
		btnReset = new Button("Reset");
		
		for(String l : LocatieFactory.getLocaties().getLanden()) {
			orcLand.add(l);
		}

		for(String p : LocatieFactory.getLocaties().getPlaatsen()) {
			orcPlaats.add(p);
		}
		
		txtOmschrijving.setPixelSize(400, 91);
		
		boxVertrekDatum.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat("d/M/y")));
		boxAankomstDatum.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat("d/M/y")));
		
		btnSubmit.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				handleReisToevoegen();
			}
		});
		
		btnReset.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				resetFields();
			}
		});
		
		KeyPressHandler reisKeyHandler = new KeyPressHandler() {
			@Override
			public void onKeyPress(KeyPressEvent event) {
				if(event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
					handleReisToevoegen();
				}				
			}
		};		
		txtNaam.addKeyPressHandler(reisKeyHandler);
		txtPrijs.addKeyPressHandler(reisKeyHandler);
	}
	
	public Panel createPage() {
		VerticalPanel vp = new VerticalPanel();
		
		HorizontalPanel columns = new HorizontalPanel();
		columns.setSpacing(5);
		
		VerticalPanel vpInfo = new VerticalPanel();
		vpInfo.add(lblNaam); vpInfo.add(txtNaam);
		vpInfo.add(lblLand); vpInfo.add(txtLand);
		vpInfo.add(lblPlaats); vpInfo.add(txtPlaats);
		columns.add(vpInfo);
		
		VerticalPanel vpData = new VerticalPanel();
		vpData.add(lblVertrekDatum); vpData.add(boxVertrekDatum);
		vpData.add(lblAankomstDatum); vpData.add(boxAankomstDatum);
		vpData.add(lblPrijs); vpData.add(txtPrijs);
		columns.add(vpData);
		
		VerticalPanel vpMoreInfo = new VerticalPanel();
		vpMoreInfo.add(lblOmschrjiving); vpMoreInfo.add(txtOmschrijving);
		columns.add(vpMoreInfo);
		vp.add(columns);
		
		HorizontalPanel hp = new HorizontalPanel();
		hp.add(btnSubmit); hp.add(btnReset);
		vp.add(hp);		
		return vp;
	}
	
	private void handleReisToevoegen() {		
		int b = 0;
		FieldVerifier fv = FieldVerifier.get();
		
		//Check Naam
		
		fv.checkField(txtNaam);
		fv.checkField(txtLand);
		fv.checkField(txtPlaats);
		fv.checkField(txtOmschrijving);
		
		if(txtNaam.getText().matches("^[A-Za-z]+$")) {
			txtNaam.setStyleName("green-border");
			b += 1;
		}
		else{
			txtNaam.setStyleName("red-border");
		}
		
		
		
		//Check Land
		if (txtLand.getText().matches("^[A-Za-z]+$")) {
			txtLand.setStyleName("green-border");
			b += 1;
		} else {
			txtLand.setStyleName("red-border");
		}
		//Check Plaats
		if (txtPlaats.getText().matches("^[A-Za-z]+$")) {
			txtPlaats.setStyleName("green-border");
			b += 1;
		} else {
			txtPlaats.setStyleName("red-border");
		}
		//Check Vertrek Datum
		if (boxVertrekDatum.getValue() != null && boxVertrekDatum.getValue().after(datToday)) {
			boxVertrekDatum.setStyleName("green-border");
			b += 1;
		} else {
			boxVertrekDatum.setStyleName("red-border");
		}
		//Check Aankomst Datum
		if (boxAankomstDatum.getValue() != null && boxAankomstDatum.getValue().after(datToday) && boxAankomstDatum.getValue().after(boxVertrekDatum.getValue())) {
			boxAankomstDatum.setStyleName("green-border");
			b += 1;
		} else {
			boxAankomstDatum.setStyleName("red-border");
		}
		//Check Prijs
		if (txtPrijs.getText().matches("^[1-9][0-9]*|[1-9][0-9]*[.,][0-9]{2}$") &&
				fv.checkField(txtPrijs.getText(), 1, 7)) {
			txtPrijs.setStyleName("green-border");
			b += 1;
		} else {
			txtPrijs.setStyleName("red-border");
		}

		if(b == 5) {
			fv.addReis(txtNaam.getText(), 
				LocatieFactory.getLocaties().checkLand(txtLand.getText()),
				LocatieFactory.getLocaties().checkPlaats(txtPlaats.getText()),
				changeComma(txtPrijs.getText()),
				boxVertrekDatum.getValue(),
				boxAankomstDatum.getValue(),
				txtOmschrijving.getText());
		}
	}
	
	public double changeComma(String prs){
		prs.replace(',' ,'.');	
		double d = Double.parseDouble(prs);
		return d;
	}

	private void resetFields() {
		txtNaam.setText(""); txtNaam.setStyleName("");
		txtLand.setText(""); txtLand.setStyleName("");
		txtPlaats.setText(""); txtPlaats.setStyleName("");
		boxVertrekDatum.setValue(null); boxVertrekDatum.setStyleName("");
		boxAankomstDatum.setValue(null); boxAankomstDatum.setStyleName("");
		txtPrijs.setText(""); txtPrijs.setStyleName("");
		txtOmschrijving.setText(""); txtOmschrijving.setStyleName("");
	}
}
